AWS認証情報をTerraform Cloudに渡さずtfstate置き場として使う方法
「Terraform CloudでAWSリソースをdeployはしなくてもいいけど、tfstate置き場として使いたいな」
tfstateの置き場に困ったことはありませんか?
Terraform Cloudにはstate管理機能があり、とても便利です。
- state管理用(S3やDynamodb)のリソースを作成する必要がない
- stateロック機能が標準でついている
- 変更差分をTerraform Cloudのコンソールから確認できる
今回はTerraform Cloudをtfstate置き場としてだけ使う方法を紹介します。
この方法では、Terraform Cloud側にAWS認証情報を設定する必要はありません。 もちらん今まで通り、ローカルからTerraformコマンドを実行できます。
この機能はFreeプランでも使用することができます。
結論
Terraform CloudのWorkspaceの設定で実行モードをLocal
にするだけです。
Terraform Cloudでは、terraform apply
やterraform plan
をどこで実行するかを設定することができます。
Local
であれば、自分の端末上で実行されます。
そのため、自分の端末上にAWS等デプロイする対象の認証情報があれば実行できます。
Remote
は、Terraform Cloud上で実行されるため、Terraform Cloud上に認証情報を設定する必要があります。
Remote
にした場合でも、自分の端末上でterraformのコマンドを実行できますが、planやapplyの処理自体はTerraform Cloud上で行われます。
この際自分の端末上でコマンドの結果を確認できますが、Terraform Cloud上で実行した結果をストリーミングしているだけです。
ちなみに、Terraform Cloudの実行モードのデフォルトはRemote
です。
やってみる
サンプルコードの用意
任意のディレクトリにテスト用のサンプルコードを用意します。
$ touch main.tf backend.tf
main.tf(AWSリソース作成)
テスト用にCloudWatch ロググループを作成するコードです。
terraform { required_providers { aws = { source = "hashicorp/aws" version = "4.58.0" } } required_version = "1.4.0" } provider "aws" { region = "ap-northeast-1" } resource "aws_cloudwatch_log_group" "tfstate_test" { name = "tfstate_test" }
backend.tf(tfstateの置き場所の定義)
terraform { cloud { organization = "<Organization名>" workspaces { name = "tfstate-tfc" } } }
Organization名はTerraform Cloudのコンソールの赤枠の部分が該当します。
Terraform CloudにCLIでログイン
ローカルで以下のコマンドを実行して、Terraform Cloudにログインします。 (以前に実施したことがある場合は、この手順はスキップできます。)
Terraform will request an API token for app.terraform.io using your browser. If login is successful, Terraform will store the token in plain text in the following file for use by subsequent commands: /Users/sato.masaki/.terraform.d/credentials.tfrc.json Do you want to proceed? Only 'yes' will be accepted to confirm. Enter a value: yes
ローカルにTerraform Cloudのクレデンシャルを作成するか聞かれる「yes」を入力すると、Terraform CloudのAPI token発行の画面に遷移します。
Create API token
を選択して、tokenを作成します。
tokenが表示されるため、コピーして先程のコンソールに貼り付けます。
Generate a token using your browser, and copy-paste it into this prompt. Terraform will store the token in plain text in the following file for use by subsequent commands: /Users/sato.masaki/.terraform.d/credentials.tfrc.json Token for app.terraform.io: Enter a value: # Tokenを貼り付ける
Enterを押すとログインに成功した旨が表示されます。
tokenは~/.terraform.d/credentials.tfrc.json
に保存されます。
Terraform Cloud Workspaceの作成
ファイルを用意したら、同じディレクトリで以下のコマンドを実行します。
$ terraform init # 省略 Terraform Cloud has been successfully initialized! You may now begin working with Terraform Cloud. Try running "terraform plan" to see any changes that are required for your infrastructure. If you ever set or change modules or Terraform Settings, run "terraform init" again to reinitialize your working directory.
コマンド実行時にbackend.tfで指定していたWorkspace名でTerraform Cloud上に自動的にWorkspaceが作成されます。
Terraform Cloud Workspaceの実行モードをLocalに変更
Terraform Cloudのコンソール上で、Workspace名(今回はtfstate-test) -> Settings
-> General
の順に選択します。
Execution Mode
をLocal
にして、Save settings
を選択します。
Terraformをローカルで実行する
AWS認証情報をローカルに設定したら、terraformコマンドが実行できます。 環境変数で認証情報を設定する方法を例として上げましたが、任意の方法を選択できます。
$ export AWS_ACCESS_KEY_ID=<アクセスキー> $ export AWS_SECRET_ACCESS_KEY=<シークレットアクセスキー> $ export AWS_SESSION_TOKEN=<セッショントークン> $ terraform plan $ terraform apply
Terraform Cloudでtfstateを確認
Terraform Cloud上でtfstateを確認してみましょう。
Terraform Cloudのコンソール上で、Workspace名(今回はtfstate-test) -> State
を選択します。
tfstateの変更履歴を確認できます。 (変更履歴を出すために、初回apply後コードを変えてapplyしたため2つ出ています。手順通りにやった場合は、1つだけでます。)
任意のバージョンを選択すると、tfstateの中身を確認できます。
他にもこの画面からは、tfstateのダウロードや変更差分の確認ができます。
トラブルシューティング
Error: configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.
terraform init
まではできたが、terraform plan
やterraform apply
時に以下のエラーがでて実行できない。
AWS認証情報をローカルに設定済み。
Error: configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.
Terraform Cloudに認証情報をセットしていない状態で、Terraform Cloud上でコマンドが実行される設定担っていると思います。
Terraform Cloudの実行モードがRemoteになっている可能性があります。 本記事の「Terraform Cloud Workspaceの実行モードをLocalに変更」を参考に実行モードをLocalに変更してください。
おわりに
Terraform Cloudをtfstate置き場として使う方法でした。
Terraform CloudにAWS認証情報を置く必要がないため、既存のデプロイフローは変えたくないけど、tfstateだけTerraform Cloudに置きたい場合に有効です。
また、ユーザー5人まで無料のFreeプランでもこの機能を使うことができます。
Terraform Cloudを使って組織でのTerraform運用を始める第一歩として、この機能を試すのも良いかもしれません。
以上、AWS事業本部の佐藤(@chari7311)でした。